gusucode.com > VC++ 界面很酷的一款多媒体播放器 > VC++ 界面很酷的一款多媒体播放器/gusucode/xMedia代码注释中/mainwindow.cpp
//Download by http://www.NewXing.com /**************************************** * File: mainwindow.cpp * * Last modified: 2004.2.7 * * Author: Yuanyi-Zhang * * Version: 0.0.0.1 * * CopyLeft 2004 xMedia team * ****************************************/ /**************************************************************** * * * This file may be distributed and/or modified under the terms * * of the GNU General Public License version 2 as published by * * the Free Software Foundation and appearing in the file * * LICENSE.GPL included in the packaging of this file. * * * ****************************************************************/ #pragma warning(disable:4786) #include <windows.h> #include <assert.h> #include <commctrl.h> #include <math.h> #include "messagedef.h" #include "mainwindow.h" #include "util.h" #define IDT_MWTIMER 1000 #define IDM_VIDEOWND 1000 #define IDM_PLAYLIST 1001 #define IDM_MINIBROW 1002 #define IDM_EQ 1003 #define IDM_ABOUT 1004 #define IDM_QUIT 1005 //初始化主窗口 bool MainWnd::initials( HWND hwnd ) { if( !InitDC() ) { m_ErrorString = _T("初始化DC失败!"); return false; } SetWindowSize(); if( !LoadResource() ) { return false; } if( !InitVolumn() ) { return false; } SetWindowRegion(); SetTimer( m_hWnd, IDT_MWTIMER, 1000, NULL ); m_HasCreated = true; return true; } //////////////////////////// //初始化工具提示 bool MainWnd::InitTooltips( HWND hwnd, HINSTANCE hInst ) { HWND hwndTT; //Tooltip控件句柄 //创建Tooltip控件 hwndTT = CreateWindowEx(WS_EX_TOPMOST, TOOLTIPS_CLASS, NULL, WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, hwnd, NULL, hInst, NULL ); if( hwndTT == NULL ) { m_ErrorString = _T("创建工具提示窗口失败!"); return false; } SetWindowPos(hwndTT, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); //这个结构体存储Tooltip控件的相关信息 TOOLINFO ti; unsigned int uid = 0; //初始化ti结构体成员 ti.cbSize = sizeof(TOOLINFO); ti.uFlags = TTF_SUBCLASS; ti.hwnd = hwnd; ti.hinst = hInst; ti.uId = uid; TCHAR tcsTooltip[256]; vector<Element>::iterator ite; RECT rect; string str; for( ite = m_vecElement.begin(); ite != m_vecElement.end(); ite++ ) { rect = ite->getRectPos(); str = ite->getTooltip(); if( (rect.left == rect.right && rect.top == rect.bottom) || str.compare( _T("") ) == 0 ) { continue; } strcpy( tcsTooltip, str.c_str() ); ti.lpszText = tcsTooltip; ti.rect = rect; //添加工具提示 SendMessage(hwndTT, TTM_ADDTOOL, 0, (LPARAM) (LPTOOLINFO) &ti); } return true; } ///////////////////////// //将窗口消息发送到主窗口消息循环 LRESULT CALLBACK MainWnd::WndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { MainWnd *pMainWnd; if ( uMsg==WM_NCCREATE ) { assert( ! IsBadReadPtr((void *) lParam, sizeof(CREATESTRUCT)) ); MDICREATESTRUCT * pMDIC = (MDICREATESTRUCT *) ((LPCREATESTRUCT) lParam)->lpCreateParams; pMainWnd = (MainWnd *) (pMDIC->lParam); assert( ! IsBadReadPtr(pMainWnd, sizeof(MainWnd)) ); SetWindowLong(hWnd, GWL_USERDATA, (LONG) pMainWnd); } else pMainWnd=(MainWnd *)GetWindowLong(hWnd, GWL_USERDATA); return pMainWnd->MsgProc( hWnd, uMsg, wParam, lParam ); } ///////////////////////// //消息循环 long MainWnd::MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { POINT p; switch( uMsg ) { case WM_CREATE: m_hWnd = hWnd; if( !initials( hWnd ) ) { MessageBox( hWnd, "初始化失败,请确保您的声音设备工作正常!","错误",MB_OK|MB_ICONWARNING ); } break; case WM_PAINT: onDraw(); break; case WM_LBUTTONDOWN: SetCapture( hWnd ); p.x = LOWORD(lParam); p.y = HIWORD(lParam); ClientToScreen( hWnd, &p ); onLButtonDown( p ); break; case WM_RBUTTONDOWN: PostThreadMessage( GetCurrentThreadId(), MC_POPUPMENU, 0, 0 ); break; case WM_TIMER: PostThreadMessage( GetCurrentThreadId(), MC_SETTIME, 0, 0 ); break; case WM_MOUSEMOVE: GetCursorPos( &p ); // ScreenToClient( hWnd, &p ); onMouseMove( p ); break; case WM_LBUTTONUP: ReleaseCapture(); p.x = LOWORD(lParam); p.y = HIWORD(lParam); ClientToScreen( hWnd, &p ); onLButtonUp( p ); break; case WM_KEYDOWN: switch( LOWORD( wParam ) ) { case VK_ESCAPE: PostThreadMessage( GetCurrentThreadId(), XM_RELEASERESOURCE, 0l, 0l ); PostQuitMessage( 0 ); return 0L; } break; case WM_COMMAND: switch( LOWORD( wParam ) ) { case IDM_VIDEOWND: PostThreadMessage( GetCurrentThreadId(), XM_VWBUTTON, 0l, 0l ); break; case IDM_PLAYLIST: PostThreadMessage( GetCurrentThreadId(), XM_PLAYLIST, 0l, 0l ); break; case IDM_EQ: PostThreadMessage( GetCurrentThreadId(), XM_EQBUTTON, 0l, 0l ); break; case IDM_MINIBROW: PostThreadMessage( GetCurrentThreadId(), XM_MBBUTTON, 0l, 0l ); break; case IDM_ABOUT: MessageBox( hWnd, "xMedia Player V1.0\n\n版权所有 2004 xMedia 开发小组", "关于xMedia Player", MB_ICONINFORMATION|MB_OK ); break; case IDM_QUIT: PostThreadMessage( GetCurrentThreadId(), XM_RELEASERESOURCE, 0l, 0l ); PostQuitMessage( 0 ); break; } break; case XM_MINBOX: switch( wParam ) { case ELEM_LBUTTONDOWN: SendMessage( hWnd, WM_SYSCOMMAND, SC_MINIMIZE, 0l ); p.x = p.y = 0; onMouseMove( p ); break; } break; case XM_CLOSEBUTTON: switch( wParam ) { case ELEM_LBUTTONDOWN: PostThreadMessage( GetCurrentThreadId(), XM_RELEASERESOURCE, 0l, 0l ); PostQuitMessage( 0 ); break; } break; case XM_SOUNDBAR: switch( wParam ) { case ELEM_MOUSEMOVE: AdjustVolumn(); break; } break; case XM_TRACKBAR: switch( wParam ) { case ELEM_MOUSEMOVE: AdjustTrack(); break; } break; case XM_PROGRESSBAR: switch( wParam ) { case ELEM_MOUSEMOVE: m_isDraggingElem = true; AdjustProgress(); break; case ELEM_LBUTTONUP: case ELEM_LBUTTONDOWN: m_isDraggingElem = false; PostThreadMessage( GetCurrentThreadId(), MC_SEEKING, 0l, 0l ); break; } break; case XM_EQBUTTON: switch( wParam ) { case ELEM_MOUSEMOVE: PostThreadMessage( GetCurrentThreadId(), XM_EQBUTTON, 0l, 0l ); break; } break; case XM_PLAYLIST: switch( wParam ) { case ELEM_MOUSEMOVE: PostThreadMessage( GetCurrentThreadId(), XM_PLAYLIST, 0l, 0l ); break; } break; case XM_MBBUTTON: switch( wParam ) { case ELEM_MOUSEMOVE: PostThreadMessage( GetCurrentThreadId(), XM_MBBUTTON, 0l, 0l ); break; } break; case XM_PLAYBUTTON: switch( wParam ) { case ELEM_LBUTTONDOWN: PostThreadMessage( GetCurrentThreadId(), MC_PLAY, 0l, 0l ); break; } break; case XM_STOPBUTTON: switch( wParam ) { case ELEM_LBUTTONDOWN: PostThreadMessage( GetCurrentThreadId(), MC_STOP, 0l, 0l ); break; } break; case XM_PAUSEBUTTON: switch( wParam ) { case ELEM_LBUTTONDOWN: PostThreadMessage( GetCurrentThreadId(), MC_PAUSE, 0l, 0l ); break; } break; case XM_PREVBUTTON: switch( wParam ) { case ELEM_LBUTTONDOWN: PostThreadMessage( GetCurrentThreadId(), MC_PLAYPREV, 0l, 0l ); break; } break; case XM_NEXTBUTTON: switch( wParam ) { case ELEM_LBUTTONDOWN: PostThreadMessage( GetCurrentThreadId(), MC_PLAYNEXT, 0l, 0l ); break; } break; } return DefWindowProc( hWnd, uMsg, wParam, lParam ); } //////////////////////////// //处理鼠标左键按下消息 void MainWnd::onLButtonDown( POINT p ) { m_LButtonDown = true; m_clickPos = p; bool isElemClicked = false; ScreenToClient( m_hWnd, &p ); vector<Element>::iterator ite; RECT validRect; for( ite = m_vecElement.begin(); ite != m_vecElement.end(); ite++ ) { if( ite->onLButtonDown( p ) ) { isElemClicked = true; validRect = ite->getRectPos(); InvalidateRect( m_hWnd, &validRect, false ); } } if( isElemClicked ) { m_LButtonDown = false; } } ////////////////////////// //处理鼠标移动消息 void MainWnd::onMouseMove( POINT p ) { RECT wndRect; GetWindowRect( m_hWnd, &wndRect ); if( m_LButtonDown ) { wndRect.left += p.x - m_clickPos.x; wndRect.right += p.x - m_clickPos.x; wndRect.bottom += p.y - m_clickPos.y; wndRect.top += p.y - m_clickPos.y; m_clickPos = p; MoveWindow(m_hWnd, wndRect.left, wndRect.top, wndRect.right - wndRect.left, wndRect.bottom - wndRect.top, true ); } else { ScreenToClient( m_hWnd, &p ); vector<Element>::iterator ite; RECT validRect; for( ite = m_vecElement.begin(); ite != m_vecElement.end(); ite++ ) { if( ite->onMouseMove( p ) ) { validRect = ite->getRectPos(); InvalidateRect( m_hWnd, &validRect, false ); } } } } ///////////////////////// //处理鼠标左键松开消息 void MainWnd::onLButtonUp( POINT p ) { if( m_LButtonDown ) { m_LButtonDown = false; } else { ScreenToClient( m_hWnd, &p ); vector<Element>::iterator ite; RECT validRect; for( ite = m_vecElement.begin(); ite != m_vecElement.end(); ite++ ) { if( ite->onLButtonUp( p ) ) { validRect = ite->getRectPos(); InvalidateRect( m_hWnd, &validRect, false ); } } } } ////////////////////////// //读取批复文件配置信息 bool MainWnd::LoadSkinConfig() { if( m_lpIL == NULL ) { return false; } string strWndRect; strWndRect = m_lpIL->Get( _T( "mainwindowrect" ) ); if( strWndRect.compare( _T( "" ) ) == 0 ) { return false; } m_WndRect = StringToRect( strWndRect ); m_SkinName = m_lpIL->Get( _T( "skinname" ) ); m_vecElement.push_back( Element( _T("minbox"), m_lpIL, XM_MINBOX, true ) ); m_vecElement.push_back( Element( _T("closebutton"), m_lpIL, XM_CLOSEBUTTON, true ) ); m_vecElement.push_back( Element( _T("songtitle"), m_lpIL, XM_SONGTITLE, true ) ); m_vecElement.push_back( Element( _T("timewnd"), m_lpIL, XM_TIMEWND, true ) ); m_vecElement.push_back( Element( _T("wavwnd"), m_lpIL, XM_WAVWND, true ) ); m_vecElement.push_back( Element( _T("bspwnd"), m_lpIL, XM_BSP, true ) ); m_vecElement.push_back( Element( _T("freqwnd"), m_lpIL, XM_FREQWND, true ) ); m_vecElement.push_back( Element( _T("soundslider"), m_lpIL, XM_SOUNDSLIDER, true ) ); m_vecElement.push_back( Element( _T("trackslider"), m_lpIL, XM_TRACKSLIDER, true ) ); m_vecElement.push_back( Element( _T("soundbar"), m_lpIL, XM_SOUNDBAR, true ) ); m_vecElement.push_back( Element( _T("trackbar"), m_lpIL, XM_TRACKBAR, true ) ); m_vecElement.push_back( Element( _T("eqbutton"), m_lpIL, XM_EQBUTTON, true ) ); m_vecElement.push_back( Element( _T("mbbutton"), m_lpIL, XM_MBBUTTON, true ) ); m_vecElement.push_back( Element( _T("playlistbutton"), m_lpIL, XM_PLAYLIST, true ) ); m_vecElement.push_back( Element( _T("progressslider"), m_lpIL, XM_PROGRESSSLIDER, true ) ); m_vecElement.push_back( Element( _T("progressbar"), m_lpIL, XM_PROGRESSBAR, true ) ); m_vecElement.push_back( Element( _T("pausebutton"), m_lpIL, XM_PAUSEBUTTON, true ) ); m_vecElement.push_back( Element( _T("nextbutton"), m_lpIL, XM_NEXTBUTTON, true ) ); m_vecElement.push_back( Element( _T("playbutton"), m_lpIL, XM_PLAYBUTTON, true ) ); m_vecElement.push_back( Element( _T("stopbutton"), m_lpIL, XM_STOPBUTTON, true ) ); m_vecElement.push_back( Element( _T("prevbutton"), m_lpIL, XM_PREVBUTTON, true ) ); m_vecElement.push_back( Element( _T("openbutton"), m_lpIL, XM_OPENBUTTON, true ) ); m_vecElement.push_back( Element( _T("randomflag"), m_lpIL, XM_RANDOMFLAG, true ) ); m_vecElement.push_back( Element( _T("cycleflag"), m_lpIL, XM_CYCLEFLAG, true ) ); m_vecElement.push_back( Element( _T("aboutflag"), m_lpIL, XM_ABOUTFLAG, true ) ); return true; } /////////////////////// //注册主窗口类 BOOL MainWnd::RegisterClass( HINSTANCE hInstance ) { WNDCLASSEX wndclass; ZeroMemory(&wndclass, sizeof(wndclass)); //Window class for the main application parent window wndclass.cbSize = sizeof(wndclass); wndclass.style = 0; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = 0; wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); wndclass.hbrBackground = (HBRUSH)(COLOR_BTNFACE+1); wndclass.lpszMenuName = 0; wndclass.lpszClassName = m_ClassName.c_str(); wndclass.hIconSm = 0; return RegisterClassEx(&wndclass); } //////////////////////////// //设置主窗口可见区域 void MainWnd::SetWindowRegion() { HRGN hWndRgn; RECT clientRect,wndRect; GetClientRect( m_hWnd, &clientRect ); GetWindowRect( m_hWnd, &wndRect ); POINT start = { 0, 0 }; ClientToScreen( m_hWnd, &start ); hWndRgn = CreateRectRgn( start.x - wndRect.left, start.y - wndRect.top, clientRect.right - clientRect.left + start.x - wndRect.left, clientRect.bottom - clientRect.top + start.y - wndRect.top ); BITMAP bmp; GetObject(m_hMaskBmp, sizeof(bmp), &bmp); HRGN temp; HDC hdc = GetDC( m_hWnd ); HDC hdcImg = CreateCompatibleDC( hdc ); ReleaseDC( m_hWnd, hdc ); SelectObject( m_hDCBack, m_hBmpBack ); SelectObject( hdcImg, m_hMaskBmp ); BitBlt( m_hDCBack, m_WndRect.left, m_WndRect.top, m_WndRect.right - m_WndRect.left, m_WndRect.bottom - m_WndRect.top, hdcImg, 0, 0, SRCCOPY ); DeleteObject( hdcImg ); for( int i = 0; i < bmp.bmWidth; i++ ) { for( int j = 0; j < bmp.bmHeight; j++ ) { if( i == 270 ) i = 270; if( GetPixel( m_hDCBack, i, j ) == RGB( 255, 255, 255 ) ) { temp = CreateRectRgn( start.x - wndRect.left + i, start.y - wndRect.top + j, start.x - wndRect.left + i + 1, start.y - wndRect.top + j + 1 ); CombineRgn( hWndRgn, hWndRgn, temp, RGN_XOR ); DeleteObject( temp ); } } } SetWindowRgn( m_hWnd, hWndRgn, false ); } //////////////////////// //设置窗口大小 void MainWnd::SetWindowSize() { RECT clientRect,wndRect; int width,height; GetClientRect( m_hWnd, &clientRect ); GetWindowRect( m_hWnd, &wndRect ); width = wndRect.right - wndRect.left - clientRect.right + clientRect.left; height = wndRect.bottom - wndRect.top - clientRect.bottom + clientRect.top; POINT start = { 0, 0 }; ClientToScreen( m_hWnd, &start ); MoveWindow( m_hWnd, 0 - start.x + wndRect.left, 0 - start.y + wndRect.top, m_WndRect.right - m_WndRect.left + width, m_WndRect.bottom - m_WndRect.top + height, true); } ///////////////////////// //创建主窗口 bool MainWnd::Create( HINSTANCE hInstance ) { if( m_HasCreated ) { m_ErrorString=_T("错误,重复创建主窗口!"); return false; } if(!RegisterClass( hInstance )) { m_ErrorString=_T("注册窗口类失败!"); return false; } m_hFont = CreateFont( 10, 5, 0, 0, 6, 0, 0, 0, GB2312_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, FF_DONTCARE, "ms scanf" ); m_hTitleFont = CreateFont( 0, 0, 0, 0, 7, 0, 0, 0, GB2312_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, FF_DONTCARE, "ms scanf" ); if( m_hFont == NULL || m_hTitleFont == NULL ) { m_ErrorString=_T("创建字体失败!"); return false; } MDICREATESTRUCT mdic; memset(& mdic, 0, sizeof(mdic)); mdic.lParam = (LPARAM) this; HWND hwnd=CreateWindow( m_ClassName.c_str(), _T("xMediaPlayer"), WS_CAPTION|WS_POPUP|WS_CLIPCHILDREN |WS_MINIMIZEBOX, 0,0,100,100, NULL, NULL, hInstance, &mdic ); if( hwnd==NULL ) { m_ErrorString = _T( "创建窗口失败!" ); return false; } if( !InitTooltips( hwnd, hInstance ) ) { return false; } return true; } ////////////////////////// //初始化DC bool MainWnd::InitDC() { if( m_hDCBack ) { DeleteObject( m_hDCBack ); } if( m_hBmpBack ) { DeleteObject( m_hBmpBack ); } HDC hdc; hdc = GetDC( m_hWnd ); m_hDCBack = CreateCompatibleDC( hdc ); m_hBmpBack = CreateCompatibleBitmap( hdc, m_WndRect.right - m_WndRect.left, m_WndRect.bottom - m_WndRect.top); if( !m_hDCBack || !m_hBmpBack ) { return false; } SelectObject( m_hDCBack, m_hBmpBack ); return true; } /////////////////////// //释放资源 void MainWnd::ReleaseResource() { if( m_hDCBack ) { DeleteObject( m_hDCBack ); } if( m_hBmpBack ) { DeleteObject( m_hBmpBack ); } if( m_hMaskBmp ) { DeleteObject( m_hMaskBmp ); } if( m_hMainBmp ) { DeleteObject( m_hMainBmp ); } if( m_hElemBmp ) { DeleteObject( m_hElemBmp ); } } //////////////////// //处理主窗口的OnDraw消息 bool MainWnd::onDraw( ) { HDC hdc,hdcImg; PAINTSTRUCT ps; hdc = BeginPaint( m_hWnd, &ps ); hdcImg = CreateCompatibleDC( hdc ); SelectObject( hdcImg, m_hMainBmp ); BitBlt( m_hDCBack, 0, 0, m_WndRect.right - m_WndRect.left, m_WndRect.bottom - m_WndRect.top, hdcImg, 0, 0, SRCCOPY ); vector<Element>::iterator ite; for( ite = m_vecElement.begin(); ite != m_vecElement.end(); ite++ ) { if( !ite->onDraw( m_hDCBack, m_hElemBmp ) ) { return false; } } BitBlt( hdc, 0, 0, m_WndRect.right - m_WndRect.left, m_WndRect.bottom - m_WndRect.top, m_hDCBack, 0, 0, SRCCOPY ); EndPaint( m_hWnd, &ps ); DeleteObject( hdcImg ); DeleteObject( hdc ); return true; } //////////////////// //读取主窗口占用资源 bool MainWnd::LoadResource() { if( m_hMaskBmp ) { DeleteObject( m_hMaskBmp ); } if( m_hMainBmp ) { DeleteObject( m_hMainBmp ); } if( m_hElemBmp ) { DeleteObject( m_hElemBmp ); } string maskBmp,mainBmp,elemBmp; maskBmp = _T( "skin\\" ) + m_SkinName + _T( "\\mask.bmp" ); mainBmp = _T( "skin\\" ) + m_SkinName + _T( "\\main.bmp" ); elemBmp = _T( "skin\\" ) + m_SkinName + _T( "\\mainelement.bmp" ); m_hMaskBmp = (HBITMAP)LoadImage( NULL, maskBmp.c_str(), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE|LR_CREATEDIBSECTION ); if( !m_hMaskBmp ) { m_ErrorString = _T("无法读取文件:") + maskBmp; return false; } m_hMainBmp = (HBITMAP)LoadImage( NULL, mainBmp.c_str(), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE|LR_CREATEDIBSECTION ); if( !m_hMainBmp ) { m_ErrorString = _T("无法读取文件:") + mainBmp; return false; } m_hElemBmp = (HBITMAP)LoadImage( NULL, elemBmp.c_str(), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE|LR_CREATEDIBSECTION ); if( !m_hElemBmp ) { m_ErrorString = _T("无法读取文件:") + elemBmp; return false; } return true; } ///////////////////////////// //调整播放音量 void MainWnd::AdjustVolumn() { Element* soundBar = getElementByName( _T("soundbar") ); Element* soundSlider = getElementByName( _T("soundslider") ); RECT validRect = soundSlider->getRectPos(); int vol = adjustSlider( soundSlider, soundBar ); WORD iVol = (( 100 - vol ) * 0xffff)/100; int lTrack,rTrack; if( m_Track < 50 ) { rTrack = m_Track; lTrack = 50; } else { rTrack = 50; lTrack = 100 - m_Track; } WORD lVol = (WORD)((iVol * lTrack)/50); WORD rVol = (WORD)((iVol * rTrack)/50); DWORD sVol = rVol; sVol <<= 16; sVol |= lVol; waveOutSetVolume( m_hWaveOut, sVol ); InvalidateRect( m_hWnd, &validRect, false ); } ///////////////////////////// //调整声道 void MainWnd::AdjustTrack() { Element* trackBar = getElementByName( _T("trackbar") ); Element* trackSlider = getElementByName( _T("trackslider") ); RECT validRect = trackSlider->getRectPos(); m_Track = adjustSlider( trackSlider, trackBar ); AdjustVolumn(); InvalidateRect( m_hWnd, &validRect, false ); } /////////////////////////////// //调整播放进度 void MainWnd::AdjustProgress() { Element* progressBar = getElementByName( _T("progressbar") ); Element* progressSlider = getElementByName( _T("progressslider") ); RECT validRect = progressSlider->getRectPos(); m_PlayProg = adjustSlider( progressSlider, progressBar ); InvalidateRect( m_hWnd, &validRect, false ); } //////////////////////////// //通过按钮名称获取按钮 Element* MainWnd::getElementByName( string str ) { vector<Element>::iterator ite; for( ite = m_vecElement.begin(); ite != m_vecElement.end(); ite++ ) { if( str.compare( ite->getName() ) == 0 ) break; } if( ite == m_vecElement.end() ) { return NULL; } return ite; } ////////////////////// //设置曲目标题 void MainWnd::setTitle( string str ) { static int i = 0; if( str.compare( _T("") ) == 0 ) { str = _T(" xMedia Player"); } str = _T(" ") + str; string istr = str.substr( i ); i++; if( i >= strlen(str.c_str()) ) i = 0; Element* elem = getElementByName( "songtitle" ); RECT rect; elem->setText( istr, m_hTitleFont, DT_LEFT|DT_VCENTER ); rect = elem->getRectPos(); InvalidateRect( m_hWnd, &rect, false ); } /////////////////////// //设置播放曲目长度 void MainWnd::setLength( long len ) { Element* elem = getElementByName( "timewnd" ); RECT rect; if( len != 0 ) { rect.left = 0; } char strBPS[MAX_PATH]; sprintf( strBPS, "%d:%d", len/60, len%60 ); elem->setText( strBPS, m_hTitleFont ); rect = elem->getRectPos(); InvalidateRect( m_hWnd, &rect, false ); } /////////////////////// //设置曲目位速率 void MainWnd::setBPS( long bps ) { // HDC hdc = GetDC( m_hWnd ); Element* elem = getElementByName( "bspwnd" ); RECT rect; char strBPS[MAX_PATH]; sprintf( strBPS, "%dKBPS", bps ); elem->setText( strBPS, m_hFont ); rect = elem->getRectPos(); InvalidateRect( m_hWnd, &rect, false ); elem = getElementByName( "freqwnd" ); if( bps == 0 ) { elem->setText( "0KHz", m_hFont ); } else { elem->setText( "44KHz", m_hFont ); } rect = elem->getRectPos(); InvalidateRect( m_hWnd, &rect, false ); // DrawText( hdc, strBPS, strlen( strBPS ), &elem->getRectPos(), DT_CENTER|DT_VCENTER ); } /////////////////////// //设置播放进度 void MainWnd::setPlayProg( int playProg ) { if( m_isDraggingElem ) { return; } Element* progressBar = getElementByName( _T("progressbar") ); Element* progressSlider = getElementByName( _T("progressslider") ); RECT validRect = progressSlider->getRectPos(); adjustSlider( progressSlider, progressBar, playProg ); InvalidateRect( m_hWnd, &validRect, false ); } /////////////////////// //设置音量 void MainWnd::setVolumn( int vol ) { if( m_isDraggingElem ) { return; } Element* soundBar = getElementByName( _T("soundbar") ); Element* soundSlider = getElementByName( _T("soundslider") ); RECT validRect = soundSlider->getRectPos(); adjustSlider( soundSlider, soundBar, vol ); InvalidateRect( m_hWnd, &validRect, false ); } ///////////////////////// //设置声道 void MainWnd::setTrack( int track ) { if( m_isDraggingElem ) { return; } Element* trackBar = getElementByName( _T("trackbar") ); Element* trackSlider = getElementByName( _T("trackslider") ); RECT validRect = trackSlider->getRectPos(); adjustSlider( trackSlider, trackBar, track ); InvalidateRect( m_hWnd, &validRect, false ); } ///////////////////////// //初始化声音 bool MainWnd::InitVolumn() { WAVEFORMATEX Format; Format.cbSize = sizeof( Format ); Format.nAvgBytesPerSec = 88200; Format.nBlockAlign = 4; Format.nChannels = 2; Format.nSamplesPerSec = 22050; Format.wFormatTag = 1; Format.wBitsPerSample=16; if( waveOutOpen((LPHWAVEOUT)&m_hWaveOut, WAVE_MAPPER, (LPWAVEFORMATEX)&Format, 0l, 0L, CALLBACK_NULL )) { return false; } DWORD vol; waveOutGetVolume( m_hWaveOut, &vol ); WORD lVol,rVol,iVol; lVol = LOWORD( vol ); rVol = HIWORD( vol ); iVol = (int)(max( lVol, rVol ) * 100 / 0xffff); m_Track = 50 - ((lVol - rVol)*100/0xffff); setTrack( m_Track ); setVolumn( 100 - iVol ); return true; }